var fixStatus={'new':'新建','draft':'草稿','commit':'提交','reject':'未通过审核','freeze':'已审核'};
var fixRole={'admin':'管理员','guest':'访客','actor':'操作员'};
function parseJson(jsonString){//解析服务器传回来的Json串.
	if('0'==jsonString)	callReload();//登录时间已经超时。
	try{
		var tmpRe=json.decode(jsonString);
	}catch(e){
		//ajax.post('utils/log.php',postParam('saveLog',{'msg':jsonString}));
		return alert('服务器异常，请联系管理员！');
	}
	return tmpRe;
}
function callReload(){
	alert('对不起，你的登录已经超时，请重新登录。');
	window.location.href='index.php'; 
}
function $(id){
	return document.getElementById(id);
}
Object.extend=function(destination,source){
    for (property in source) destination[property]=source[property];
    return destination;
}
Function.prototype.bind=function(obj){//改变this
	var t=this;
	return function(){
		return t.apply(obj,arguments);
	}
}
Array.prototype.isIn=function(p){//检验一个值是否在array中。
	var l=this.length;
	for(var i=l-1;i>=0;i--)//哈哈哈。
		if(p==this[i])	return i;
	return -1;
}
Array.prototype.singlePush=function(c){//如果该数组已经有了这个元素，则返回
	if(-1!=this.isIn(c))	return;
	this.push(c);
}
Array.prototype.single=function(){
	var l=this.length,result=[];
	for(var i=0;i<l;i++)
		if(-1==result.isIn(this[i]))	result.push(this[i]);
	return result;
}
Array.prototype.getIndex=function(p){//获得一个元素在数组里的index
	var l=this.length;
	for(var i=0;i<l;i++)
		if(p==this[i])	return i;
	return -1;
}
String.prototype.trim=function(){//去掉字符串两边的空格
    return this.replace(/(^\s*)|(\s*$)/g,'');
}
String.prototype.isNum=function(){
	if(this=='')	return true;
	if(/\./.test(this))
		return(/^\d+\.\d+%?$/.test(this));
	else
		return(/^\d+%?$/.test(this));
}
var TEMPLATES={};//所有模板名称
function postParam(pAction,pJsonObj) {//Ajax Post的时候相当于数据打包
	return 'action='+pAction+'&json='+json.encode(pJsonObj);
}
function $C(eName,propertys){//DOM对象创建函数。
	var childObj,argLen=arguments.length;
	var domAttr;
	var tmpObj=document.createElement(eName);
	var fix={'class':'className','colspan':'colSpan','rowspan':'rowSpan'};
	for(var pro in propertys){
		domAttr=fix[pro]||pro;
		tmpObj[domAttr]=propertys[pro];
	}
	if(argLen==2)return tmpObj;
	for(var i=2;i<argLen;i++){
		childObj=arguments[i];
		if('string'==typeof(arguments[i]))
		tmpObj.innerHTML+=arguments[i];
		else{
			try{
				tmpObj.appendChild(childObj);
			}catch(e){
				if('number'==typeof(arguments[i]))
					tmpObj.innerHTML=arguments[i]+'';
				else
					alert('创建'+eName+'参数中参数:'+arguments[i]+'有问题');
			}
		}
	}
	return tmpObj;
}
function freeRam(){
	for(var t in TABLES){
		delete(TABLES[t]);
	}
	//CollectGarbage();
}
function hasAttribute(ats,at){//因为IE没有Dom.hasAttribute这个方法。
	for(var i=0;i<ats.length;i++){
		if(ats[i].name==at)	return true;
	}
	return false;
}
function emptyFunc(){}//空函数
var eve=new Object();//事件绑定
eve.observe=function(element,name,observer){
	if(browser.ie)
		element.attachEvent("on"+name,observer);
	else
		element.addEventListener(name,observer,false);
}
eve.stopObserve=function(element,name,observer){
	if(browser.ie)
		element.detachEvent("on"+name,observer);
	else
		element.removeEventListener(name,observer,false);
		
}
function newOption(n,v,t){
	var opt=$C('option',{'value':v},n);
	if(t)	opt.selected=t;
	return opt;
}
function closeEditPanel(){
	//SYS_STATUS.isEditing=false;
	//debug('me');
	SYS_STATUS.selectCell=false;
	SYS_STATUS.isEditing=false;
	SYS_STATUS.editPanel.className='hide';
}
var browser=(function(){//浏览器判断
	var b=navigator.userAgent.toLowerCase();
	return {
	safari:/webkit/.test(b),
	opera:/opera/.test(b),
	ie:/msie/.test(b) && !/opera/.test(b),
	mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
};})();
function debug(str){//调试函数，比alert好用多了。
	$('debug').appendChild($C("span",{},' '+str));
}
function getPosition(e){//取得对象的绝对位置
	var t=e.offsetTop;
	var l=e.offsetLeft;
	while(e=e.offsetParent){
		t+=e.offsetTop;
		l+=e.offsetLeft;
	}
	return [t,l];
}
function isAdmin(){
	return 'admin'==SYS_STATUS.userInfo.role;
}
function getSize(e){
	return [e.clientWidth,e.clientHeight];	
}
var TABLES={};//所有表格
var SYS_STATUS={//系统状态
	loading:function(){//显示加载状态
		this.showLoad('加载中');
	},
	saving:function(){//显示保存状态
		this.showLoad('保存中');
	},
	loadComplete:function(){//结束加载状态
		document.body.removeChild($('loading'));
		document.body.removeChild($('loadingImg'));
		document.body.className='';
	},
	showLoad:function(s){
		var block=$C('div',{'id':'loading','class':'shadow'});
		block.style.height=getPosition($('foot'))[0]+'px'
		document.body.appendChild(block);
		document.body.appendChild($C('div',{id:'loadingImg'},s+'.....<br/><br/>',$C('img',{'src':'images/loading.gif','width':'138','height':'25'})));
		document.body.className='wait';	
	},
	selectCell:false//当前选中的单元格
};
function showStatus(s){
	(new displayStatus(s)).init();
}
function displayStatus(str){//闪烁着显示消息,吸引用户眼球
	this.span=$C('span',{},str);
}
displayStatus.prototype={
	isOn:false,//是否已经处于显示状态
	times:20,//总共闪烁次数
	flash:0,//已经闪烁次数
	isRed:true,//是否是红色背景
	bar:null,
	init:function(){
		this.bar=document.getElementById('statusBar');
		if(!this.bar)	return;
		this.bar.appendChild(this.span);
		setTimeout(this.flashSpan.bind(this),100);
	},
	flashSpan:function(){
		if(this.flash++==this.times)	return	this.stopFlash();//如果已经达到闪烁次数
		if(this.isRed){
			this.span.style.background='red';
		}else{
			this.span.style.background='yellow';
		}
		this.isRed=!this.isRed;
		setTimeout(this.flashSpan.bind(this),100);
	},
	stopFlash:function(){
		this.span.style.background='#dff2f9';
		setTimeout(function(){this.bar.removeChild(this.span)}.bind(this),5000);//闪过之后,再显示5秒种
	}
};
function IF(){//公式里的IF判断
	return arguments[0]?arguments[1]:arguments[2];
}
function COMPARE(){//比较
	var len=arguments.length;
	var arg=arguments[0];
	for(var m=1;m<=(len-3);m+=2)//最后一个参数是默认值
		if(arg==arguments[m])	return arguments[m+1];
	return arguments[len-1];
}
function SEGMENT(){//段
	var len=(arguments.length-1)/2;
	var arg=arguments[0];
	if(arg<=arguments[1]) return 0;
	for(var m=1;m<len;++m)
		if(arg>arguments[m]&&arg<=arguments[m+1])	return arguments[len+m];
	return arguments[len*2];
}
function QUOTA(code,depth){
	depth=parseInt(depth);
	if(0==depth)	return 0;
	var t=QUOTATREE['T'+code]['item'],l=t.length,d1,d2,re=/(\d+)/;
	re.exec(t[0]['name']);
	d1=parseInt(RegExp.$1);
	if(depth<d1)	return t[0]['workinghour'];
	for(var i=0;i<l-1;i++){//l-1是无论depth大于小于还是等于最大项都会返回最大项
		re.exec(t[i]['name']);
		d1=parseInt(RegExp.$1);
		re.exec(t[i+1]['name']);
		d2=parseInt(RegExp.$1);
		if(depth>=d1&&depth<d2)	return t[i+1]['workinghour'];
	}
	return t[l-1]['workinghour'];//返回最大项
}
//*
function treatFormula(tableId,tdNo,formula){//整理公式，得出单元格之间的依赖关系和连动性
	this.tableId=tableId;
	this.tdNo=tdNo;
	this.formula=formula;
	//debug(formula+'<br><br>');
}
treatFormula.prototype={
	init:function(){
		var cellNo='',tmpFormula,tmpC,isCellNo=false,tmpCellName,l;
		this.doReplace();//首先整理公式,以便继续分析
		tmpFormula=this.formula.split('');
		l=tmpFormula.length;
		for(var i=0;i<l;i++){
			tmpC=tmpFormula[i];
			if('['==tmpC){
				isCellNo=true;
				continue;
			}
			if(']'==tmpC){
				if(-1==TABLES[this.tableId]['vars'][this.tdNo].isIn(cellNo)){//该变量前面是否已经出现过
					TABLES[this.tableId]['vars'][this.tdNo].push(cellNo);//如果没有加到变量数组
					tmpCellName=getCellName(cellNo);
					TABLES[tmpCellName[0]]['relations'][tmpCellName[1]].push('$'+this.tableId+'_'+this.tdNo);//把变量所表示的单元格加到公式所表示的单元格的联动数组里
				}
				isCellNo=false;
				cellNo='';
			}
			if(true==isCellNo)
			cellNo+=tmpC;
		}
		TABLES[this.tableId]['formulas'][this.tdNo]=this.formula;
	},
 	doReplace:function(){
		this.formula=this.formula.replace(/&lt;/g,'<');
		this.formula=this.formula.replace(/&gt;/g,'>');
		if(/[^><]=/.test(this.formula))	this.formula=this.formula.replace(/=/g,'==');//执行IF判断相等的时候计算机用的==而人脑是用=
		this.formula=treatSum(this.formula);//处理公式中的SUM()
		this.formula=this.formula.replace(/((\$[^_]+_)?[A-Z]\d+)+/g,'[$1]');//把公式中所涉及的变量用[]括起来,方便分析
		this.formula=this.formula.replace(/\[([A-Z]+\d+)\]/g,'[$'+this.tableId+'_$1]');//把公式中没有表单号的变量加上表单号.如F1变成$basic_F1
	}
};//*/
function treatSum(formula){
	if(false==/SUM/i.test(formula))	return formula;
	var tmpFor='',splFor;
	splFor=formula.split(/SUM/i);//可能会有很多个sum
	for(var i=0;i<splFor.length;i++){
		if(false==/^\([^\)]+\:/.test(splFor[i])){
			tmpFor+=splFor[i];
			continue;
		}
		/\(((\$[^_]+_)?[A-Z]+)(\d+)\:(\$[^_]+_)?[A-Z]+(\d+)\)(.*)/.exec(splFor[i]);
		tmpFor+='('+RegExp.$1+RegExp.$3;//前面加上( 再把第一个数放进去,避免For循环的时候判断是否是首项，或者末项，不加'+'
		for(var j=parseInt(RegExp.$3)+1;j<=parseInt(RegExp.$5);j++)//RegExp.$3+1是因为第一项已经放进去了
		tmpFor+='+'+RegExp.$1+j;
		tmpFor+=')'+RegExp.$6;
	}
	return tmpFor;
}
function parseFormula(){//解析由一个单元格变动引起的连动的计算顺序
	this.arrRe=[];
}
parseFormula.prototype={
	doParse:function(cellNo){
		var tmpCellName=getCellName(cellNo),tmpIn,tmpC;
		if(0==TABLES[tmpCellName[0]]['relations'][tmpCellName[1]].length)	return;
		var tmpRe=TABLES[tmpCellName[0]]['relations'][tmpCellName[1]];
		for(var i=0;i<tmpRe.length;i++){
			tmpIn=this.arrRe.isIn(tmpRe[i]);
			if(-1!=tmpIn)	this.arrRe[tmpIn]=0;//把已经出现的重复项清空
			this.arrRe.push(tmpRe[i]);
			this.doParse(tmpRe[i]);
		}
	},
	cleanUpRelation:function(){//清理数组，得到将返回的数组
		var l=this.arrRe.length,result=[];
		for(var i=0;i<l;i++){
			if(0==this.arrRe[i])	continue;
			result.push(this.arrRe[i]);
		}
		return result;
	},
	init:function(cellNo){
		this.doParse(cellNo);
		return this.cleanUpRelation();
	}
};//*/
function calculate(cellNo){
	this.cellNo=cellNo;
}
calculate.prototype={
	formula:'',
	result:0,
	cell:'',
	cellName:new Array(),
	init:function(){
		this.cellName=getCellName(this.cellNo);
		this.formula=TABLES[this.cellName[0]]['formulas'][this.cellName[1]];
		this.cell=getCell(this.cellNo);
		this.getVarsValue();
		this.doCalculate();
		this.complete();
	},
	getVarsValue:function(){//取得所涉及的变量的值,替换公式里变量出现的位置,形成完整的公式
		//debug(this.cellNo+'=>'+TABLES[this.cellName[0]]['vars'][this.cellName[1]]+'<br/>');
		var tmpVars=TABLES[this.cellName[0]]['vars'][this.cellName[1]],l=tmpVars.length,tmpValue,tmpCell;
		//debug(this.formula+'<br>');
		for(var i=0;i<l;i++){
			tmpCell=getCell(tmpVars[i]);
			tmpValue=tmpCell.cellValue;
			if(tmpCell.editType>0)
				if(2==tmpCell.datatype)	tmpValue='\''+tmpValue+'\'';//如果是字符比如 5寸 如果直接加入计算会得出0.所以加上''
			//if(this.cellNo=='$push2_H26')	debug(tmpValue);
			this.formula=this.formula.replace(new RegExp('\\\[\\'+tmpVars[i]+'\\\]','g'),tmpValue);
		}//if(this.cellNo=='$shot_G18')debug(this.formula+'<br/>');
	},
	doCalculate:function(){//正式执行计算
		try{
			this.result=eval(this.formula);
		}catch(e){
			if(/(\d+)%/.test(this.formula)){
				this.formula=this.formula.replace(/(\d+)%/g,'$1/100');
				this.result=eval(this.formula);
			}else
				this.result=0;
		}
		if('number'==typeof(this.result))	this.result=this.result.toFixed(2);//如果结果是数字，则取小数点后两位
	},
	complete:function(){//收尾工作
		var oldValue=this.cell.cellValue;
		if(oldValue==this.result)	return;//如果值未变则返回
		this.cell.innerHTML=this.result;
		this.cell.cellValue=this.result;
		TABLES[this.cellName[0]]['dirtyCell'].singlePush(this.cell.cellNo);//加到dirtyCell里
		addClass(this.cell,'green');//字变绿
	}
};
function getCell(cellStr){//分析单元格代码。比如$basic_A1 返回单元格对象
	//var tmp;
	//cellStr=cellStr.replace('$','');
	//tmp=cellStr.split('_');
	/\$([^_]+)_([A-Z]\d+)/.exec(cellStr);
	return TABLES[RegExp.$1]['cell'][RegExp.$2];
}
function getCellName(cellStr){
	/\$([^_]+)_([A-Z]\d+)/.exec(cellStr);
	return [RegExp.$1,RegExp.$2];
}
if (!window.XMLHttpRequest)//For Ie XmlHttpRequst
var XMLHttpRequest=function(){
	return new ActiveXObject('Microsoft.XMLHTTP');
};
var ajax=new Object();//Ajax请求类
ajax.get=function(url,callback,asynType){
	(new request(url,callback,null,asynType||true)).doGet();//默认为true 即 异步通迅
}
ajax.post=function(url,data,callback,asynType){
	(new request(url,callback,data,asynType||true)).doPost();//默认为true 即 异步通迅
}
function request(url,callback,data,asynType){
	this.url=url;
	this.callback=callback;
	this.data=data;
	this.asynType=asynType;
	this.xmlRequest=new XMLHttpRequest();
}
request.prototype={
	init:function(){//初使化
		this.xmlRequest.onreadystatechange=this.checkStatus.bind(this);
	},
	doPost:function(){//执行post方法
		this.init();
		this.xmlRequest.open('POST',this.url,this.asynType);
		this.xmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		this.xmlRequest.send(this.data);
	},
	doGet:function(){//执行get方法
		this.init();
		this.url+=this.url.indexOf('?')>0?'&':'?'+'r='+Math.random();
		this.xmlRequest.open('GET',this.url,this.asynType);
		this.xmlRequest.send(null);
	},
	checkStatus:function(){
		var ct;//contentType
		if(4==this.xmlRequest.readyState){
			if(true==this.isSuccess()){
				ct=this.xmlRequest.getResponseHeader('content-type');
				this.callback(ct.indexOf('xml')>0?this.xmlRequest.responseXML:this.xmlRequest.responseText);
			}
			else
				debug('url:'+this.url+' data:'+this.data+' errorCode:'+this.xmlRequest.status+'msg:'+this.xmlRequest.responseText);
		}
	},
	isSuccess:function(){
		return this.xmlRequest.status<300;
	}
};
function addClass(elem,cName){//增加一个className
	if(elem.className.indexOf(cName)>=0)	return;//如果已经有了这个classname,return
	var s=(elem.className=='')?'':' ';
	elem.className+=s+cName;
}
function removeClass(elem,cName){//去掉一个className
	var t=elem.className.indexOf(cName);
	if(cName==elem.className)	return elem.className='';
	var s='';
	if(-1==t)	return;
	if(0==t)
		s=cName+' ';
	else
		s=' '+cName;
//	debug('a'+s+'b');
	elem.className=elem.className.replace(s,'');
//	debug('now'+elem.className);
}
function canEdit(f){
	f=f||SYS_STATUS.fileInfo;
	if(isAdmin())	return true;//管理员
	if(f.author==SYS_STATUS.userInfo.name)
		if(isStatus('new',f.status)||isStatus('draft',f.status)||isStatus('reject',f.status))	return true;//新建文件或者 草稿 未通过审核
	return false;
}
function closeEdit(){
	var cell;
	for(var t in TABLES){
		TABLES[t].canEdit=false;//不可编辑
		cell=TABLES[t]['cell'];
		for(var c in cell){
			if(cell[c].editType>0)	removeClass(cell[c],'canEdit');//debug(cell[c].className);//removeClass(cell[c],'canEdit');//单元格颜色变正常
		}
	}
}
function changeStatusDis(s){
	$('infobar_status').innerHTML=fixStatus[s];
}
function isStatus(s,f){
	//debug(this.caller);
	return s==f;
}
function translateExpression(expression){//HTML上下标表示式解析
	this.expression=expression;
	this.isPair=0;//括号是否配对
	this.result='';
}
translateExpression.prototype={
	upMark:'^',//上标
 	downMark:'_',//下标
  	s:[],//堆栈stack
	isCheck:false,//是否是检查公式正确性
  	init:function(isCheck){
		this.isCheck=isCheck||false;
		this.s=[''];//初始化为'',防止溢出
		if(0==this.expression.length){//如果是空串,则返回
			this.result=this.expression;
			return this.returnResult();
		}
		var exp=this.expression.split('');
		var l=exp.length,mark;
		for(var i=0;i<l;i++){
			if(this.isPair<0)	this.exception();//防止表达式右括号多于左括号
			switch(exp[i]){
				case this.upMark:
				case this.downMark:
					mark=(exp[i]==this.upMark)?'sup':'sub';
					this.result+='<'+mark+'>';
					this.s.push('</'+mark+'>');
					break;
				case this.leftBracket:
					this.isPair++;
					this.s.push('');
					break;
				case this.rightBracket:
					this.isPair--;
					this.writeClose();
					break;
				default:
					this.result+=exp[i];
			}
		}
		if(0!=this.isPair)	this.exception();//括号不配对
		this.pushAllData();
		return this.returnResult();
	},
 	exception:function(){
		if(this.isCheck)	return false;
		return this.expression;
	},
 	pushAllData:function(){//把留在堆栈里的数据释放出来
		while(this.s.length>1)
		this.result+=this.s.pop();
	},
 	writeClose:function(){
		var tmp;
		do{
			tmp=this.s.pop();
			this.result+=tmp;
		}while(tmp!='');
	},
	returnResult:function(){
		if(this.isCheck)	return true;
		return this.result;
	}
};
function inputValue(e){
	var result=-1;
	if(false==SYS_STATUS.selectCell)	return;
	var kcode=e.which||e.keyCode;
	switch(kcode){//1:edit,2:up ,3:right,4:down,5:left
		case 13://enter
			if(e.altKey){
				result=6;
				break;//alt+回车
			}
		case 108://小键盘enter
		case 9://tab
			result=4;
			break;
		case 40://down
			if(false==SYS_STATUS.isDblClick)	result=4;
			break;
		case 38://up
			if(false==SYS_STATUS.isDblClick)	result=2;
			break;
		case 39://right
			if(false==SYS_STATUS.isDblClick)	result=3;
			break;
		case 37://left
			if(false==SYS_STATUS.isDblClick)	result=5;
			break;
		case 229://输入法
		case 32://spacebar
		case 8://backSpace
			result=1;
			break;
		default://其它
			if(kcode<58&&kcode>46)	result=1;
			if(kcode<91&&kcode>64)	result=1;
			if(kcode<112&&kcode>95)	result=1;
			if(kcode<193&&kcode>185)	result=1;
			if(kcode<223&&kcode>218)	result=1;
			break;
	}
	if(-1==result)	return;
	//debug(result);
	if(1==result){
		if(true==SYS_STATUS.isEditing)	return;
		TABLES[SYS_STATUS.currentTable].editCell('');
	}else if(6==result){
		if(false==SYS_STATUS.isEditing)	return;//如果不在编辑状态，则返回
		if(1!=SYS_STATUS.selectCell.editType)	return;//如果不是文本编辑框，返回
		if(1==SYS_STATUS.selectCell.datatype)	return;//如果是数字类型，返回
		if(true==SYS_STATUS.isTextarea){//如果已经是texearea则把textarea变高
			TABLES[SYS_STATUS.currentTable].enterTextarea();
			return;
		}
		var tmpValue=SYS_STATUS.editPanel.firstChild.value;
		//var tmpCell=SYS_STATUS.selectCell;
		TABLES[SYS_STATUS.currentTable].editEnd();//结束先前编辑状态
		SYS_STATUS.isDblClick=true;
		SYS_STATUS.editPanel.className='show';
		//SYS_STATUS.selectCell=tmpCell;
		TABLES[SYS_STATUS.currentTable].editCell(tmpValue+'<br/>');
	}
	else{
		if(true==SYS_STATUS.isTemplate)//如果是模板编辑状态
			TABLES[SYS_STATUS.currentTable].editEnd();
		else{
			TABLES[SYS_STATUS.currentTable].goToCell(--result);//1:up 2:right 3:down 4:left
			return false;//这里return false是在IE浏览器下页面不会跟着上、下方向键移动。
		}
	}
}
function goToEditCell(){//双击事件
	if(true==SYS_STATUS.isEditing)	return;
	SYS_STATUS.isDblClick=true;
	TABLES[SYS_STATUS.currentTable].editCell(SYS_STATUS.selectCell.innerHTML);
}
function makeSelect(listStr,intValue){
	var opt=listStr.split('|'),tmpOpt;
	var selectObj=$C('select',{});
	for(var i=0;i<opt.length;i++){
		tmpOpt=$C('option',{'value':opt[i]},opt[i]);
		if(intValue==listStr[i])	tmpOpt.selected=true;
		selectObj.appendChild(tmpOpt);
	}
	//eve.observe(selectObj,'change',function(){this.value=}.bind(selectObj));
	return selectObj;
}
function isNeedSave(){//是否提示用户保存更改
	for(var t in TABLES){
		//debug(TABLES[t].dirtyCell.length+' ');
		if(true==TABLES[t].isDirty())	return true;
	}
	return false;
}
function askIsSave(callBack){
	var savePake=makeSavePake();
	psbirdDialog.confirm('是否保存对“'+SYS_STATUS.fileInfo.wellno+'”的修改',{'保存':function(){postBudget(savePake);callBack();},'放弃':function(){cleanDirtyCell('dirtyCell');callBack();},'取消':emptyFunc});
}
function makeSavePake(){//生成保存文件时的数据包
	if(false==isNeedSave())	return;//如果不需要保存，返回
	var d,savePake={},tmpValue;
	savePake.wellno=SYS_STATUS.fileInfo.wellno;
	savePake.datapake={};
	for(var t in TABLES){
		if(false==TABLES[t].isDirty())	continue;
		savePake.datapake[t]={};
		d=TABLES[t].dirtyCell;
		for(var i=0;i<d.length;i++){
			var tmpObj={};
			tmpValue=getCell('$'+t+'_'+d[i]).cellValue;
			if(/\&nbsp;|\+/.test(tmpValue))	tmpValue=cleanValue(tmpValue);
			savePake.datapake[t][d[i]]=tmpValue;
		}
	}
	return savePake;
//debug(json.encode(savePake));
}
function cleanValue(str){
	str=str.replace(/\&nbsp;/g,' ');
	str=str.replace(/\+/g,'＋');//不知道为什么,php无法显示+号
	return str;
}
function saveBudget(){
	if(false==isNeedSave())	return;//  showStatus('文件没有新改动，不用保存');//如果不需要保存，返回
	postBudget(makeSavePake());
}
function postBudget(savePake){
	//closeEditpanel();
	SYS_STATUS.saving();
	ajax.post('utils/file.php',postParam('save',{'pake':savePake}),function(result){
		//alert(re);
		var re=parseJson(result);
		SYS_STATUS.loadComplete();
		if(1==re.result){
			showStatus('文件保存成功！');
			cleanDirtyCell('dirtyCell');
		}else{
			showStatus(re.reason);
		}
 	});
}
function cleanContent(obj){//清除面板的内容
	while(obj.childNodes.length>0)
		obj.removeChild(obj.firstChild);
}
function cleanDirtyCell(dirty){
	for(var t in TABLES){
		dirtys=TABLES[t][dirty];
		for(var i=0;i<dirtys.length;i++)
			removeClass(TABLES[t]['cell'][dirtys[i]],'green');
		TABLES[t].dirtyCell.length=0;
	}
}
function showmsg(message){//出错信息
	psbirdDialog.alert(message);
}